home *** CD-ROM | disk | FTP | other *** search
- /* Copyright 1990 by Christopher A. Wichura.
- See file GIFMachine.doc for full description of rights.
- */
-
- /* This function will take the gif screen we have read in and scale it to
- one half of its previous X size.
-
- What we do here is just a step above skipping every other pixel (like
- most routines I have seen do). While we still put emphasis on the
- even pixels, we at least take account of the odds next to them by
- using a weighted average.
-
- This method is by no means the best way to do this. If anyone wants
- to build a smarter one I would be very interested in seeing it.
- */
-
- #include "GIFMachine.h"
-
- extern struct GIFdescriptor gdesc;
- EXTERNBITPLANE;
-
- extern char *AbortMsg;
-
- extern BOOL DisplayCounts;
-
- void DoXComp(void)
- {
- register UWORD x1;
- register UWORD x2;
- register UWORD y;
- register UWORD num;
- UWORD ColBuf[3];
- UWORD NewWidth;
-
- NewWidth = gdesc.gd_Width >> 1;
- if (NewWidth & 1)
- NewWidth++;
-
- MyPrintf("...Compressing width to %ld.\n......", NewWidth);
- if (DisplayCounts)
- PutStr("Line ");
- else
- PutStr("Working");
- Flush(Output());
-
- for (y = 0; y < gdesc.gd_Height; y++) {
- if (DisplayCounts)
- MyPrintf("%5ld", y);
-
- for (x1 = x2 = 0; x2 < gdesc.gd_Width; x1++, x2 += 2) {
- num = 4;
-
- ColBuf[0] = BitPlane[y][x2].rgb_Red * 4;
- ColBuf[1] = BitPlane[y][x2].rgb_Green * 4;
- ColBuf[2] = BitPlane[y][x2].rgb_Blue * 4;
-
- if (x2 > 1) {
- num += 2;
-
- ColBuf[0] += BitPlane[y][x2 - 1].rgb_Red * 2;
- ColBuf[1] += BitPlane[y][x2 - 1].rgb_Green * 2;
- ColBuf[2] += BitPlane[y][x2 - 1].rgb_Blue * 2;
- }
-
- if (x2 + 1 < gdesc.gd_Width) {
- num += 2;
-
- ColBuf[0] += BitPlane[y][x2 + 1].rgb_Red * 2;
- ColBuf[1] += BitPlane[y][x2 + 1].rgb_Green * 2;
- ColBuf[2] += BitPlane[y][x2 + 1].rgb_Blue * 2;
- }
-
- BitPlane[y][x1].rgb_Red = ((ColBuf[0] + num / 2) / num);
- BitPlane[y][x1].rgb_Green = ((ColBuf[1] + num / 2) / num);
- BitPlane[y][x1].rgb_Blue = ((ColBuf[2] + num / 2) / num);
- }
-
- BitPlane[y][x1].rgb_Red = BitPlane[y][x1].rgb_Green = BitPlane[y][x1].rgb_Blue = 0;
-
- if (SetSignal(0L, SIGBREAKF_CTRL_C) & SIGBREAKF_CTRL_C) {
- MyPrintf("\n%s", AbortMsg);
- MyExit(ABORTEXITVAL);
- }
-
- if (DisplayCounts)
- PutStr("\x1B[5D");
- }
-
- MyPrintf("\x1B[%ldDCompressed. \n", (DisplayCounts ? 5 : 7));
-
- gdesc.gd_Width = NewWidth;
- }
-